package la.iok.hzsvn.lewin.movie.shopmovie.service;

import la.iok.hzsvn.lewin.movie.core.Token;
import la.iok.hzsvn.lewin.movie.core.shopmovie.param.CouponUseRecordListParam;
import la.iok.hzsvn.lewin.movie.core.shopmovie.vo.CouponUseRecordVo;
import la.iok.hzsvn.lewin.movie.core.shopmovie.vo.PlayerFeeVo;
import la.iok.hzsvn.lewin.movie.shopmovie.entity.CouponUseRecord;
import la.iok.hzsvn.lewin.mybatis.model.PageParam;
import la.iok.hzsvn.lewin.mybatis.model.PageVo;
import la.iok.hzsvn.lewin.mybatis.model.SortParam;
import la.iok.hzsvn.lewin.mybatis.service.BaseService;
import la.iok.hzsvn.share.annotations.NotNull;
import la.iok.hzsvn.share.annotations.NotNullElement;
import la.iok.hzsvn.share.annotations.Nullable;

import java.util.List;

public interface CouponUseRecordService extends BaseService<CouponUseRecord, Long> {
    /**
     * 使用优惠券.优惠券只能抵扣剧本费
     * @param token 操作用户,应该是优惠券持有人
     * @param carpoolId 拼车id
     * @param couponId 优惠券id
     * @return 保存的记录id
     */
    Long save(@NotNull Token token, Long carpoolId, Long couponId);

    /**
     * 使用优惠券.优惠券只能抵扣剧本费
     * @param token 操作用户,应该是优惠券持有人
     * @param carpoolId 拼车id
     * @param couponId 优惠券id
     * @param playerFeeID 玩家费用id
     * @return 保存的记录id
     */
    Long choice(@NotNull Token token, Long carpoolId, Long couponId,@NotNull Long playerFeeID);


    /***
     * 分页查询优惠券使用记录.店铺员工查询当前店铺优惠券使用记录，玩家查询个人的优惠券使用记录。两种类型身份都有就取并集
     * @param token 操作用户
     * @param pageParam 分页参数
     * @param sortParam 排序参数
     * @param listParam 列表过滤参数
     * @return 分页结果对象
     */
    @NotNull
    PageVo<CouponUseRecordVo> page(@NotNull Token token, @NotNull PageParam pageParam, @NotNull SortParam sortParam,
                                   @NotNull CouponUseRecordListParam listParam);

    /***
     * 分页查询优惠券使用记录.店铺员工查询当前店铺优惠券使用记录，玩家查询个人的优惠券使用记录。两种类型身份都有就取并集
     * @param token 操作用户
     * @param pageParam 分页参数
     * @param sortParam 排序参数
     * @param listParam 列表过滤参数
     * @return 分页结果对象
     */
    @NotNull
    PageVo<CouponUseRecordVo> getpage(@NotNull Token token, @NotNull PageParam pageParam, @NotNull SortParam sortParam,
                                   @NotNull CouponUseRecordListParam listParam);

    /**
     * 确认优惠券使用记录。一般客服在返现给用户之前确认优惠券使用记录
     * @param token 操作用户
     * @param id 使用记录id
     */
    void confirm(@NotNull Token token, @Nullable Long id);

    /**
     * 查询拼车中所有玩家的费用及优惠券使用的信息
     * @param token 操作用户
     * @param carpoolId 拼车id
     * @return 玩家费用及优惠券使用的信息
     */
    @NotNull
    @NotNullElement
    List<PlayerFeeVo> fees(Token token, Long carpoolId);

    /**
     * 删除拼车中的玩家
     * @param token 操作用户
     * @param playerId 玩家id
     */
    void deletePlayer(@NotNull Token token, @Nullable Long playerId);

    @NotNull
    CouponUseRecord selectCouponUseRecord(@NotNull Long carpoolId,@NotNull Long playerFeeId);

    Long deleteCouponUseRecord(@NotNull Token token,@NotNull Long id);
}
